#!/usr/bin/env python3
"""
脚本名称：ch45_exe.py
功能描述： 演示 使用 threading 模块创建线程，MyThread 从 threading.Thread 继承创建一个新的子类，并实例化后调用 start() 方法启动新线程，即它调用了线程的 run() 方法,进行分别每秒和每2秒打印一次当前时间
作者：Gavin
创建日期：2025-05-22
版本：1.0
依赖库：无
使用方法： python ch45_exe.py
"""

import threading
import time

# 全局标志，用于控制线程退出
exitFlag = 0


class MyThread(threading.Thread):
    def __init__(self, threadID, thread_name, counter):
        # 调用父类（threading.Thread）的构造函数，确保自定义线程类正确初始化
        threading.Thread.__init__(self)
        # super().__init__()  # 等价于 threading.Thread.__init__(self),更简洁，推荐写法
        self.threadID = threadID
        self.thread_name = thread_name
        self.counter = counter

    def run(self):
        print("开始线程: " + self.name)
        print_time(self.name, self.counter)
        print("退出线程：" + self.name)


def print_time(thread_name, delay):
    count = 0
    # 只要 exitFlag 为 0，线程就继续运行
    while not exitFlag:
        time.sleep(delay)
        count += 1
        print(f"{thread_name}: {time.ctime(time.time())} (执行次数: {count})")


# 创建线程
thread1 = MyThread(1, "thread-1", 1)  # 每秒打印一次
thread2 = MyThread(2, "thread-2", 2)  # 每2秒打印一次
# 开启新线程
thread1.start()
thread2.start()

# 主线程等待3秒，然后设置 exitFlag=1，通知子线程退出
# 意味着thread1 线程可以执行2次，thread1 只能只能执行两次
time.sleep(3)
exitFlag = 1  # 设置退出标志
print("\n主线程通知所有子线程退出...\n")

# 等待所有线程安全退出
thread1.join()
thread2.join()
print("退出主线程")
